package com.ntd.study.base.thread;

import cn.hutool.core.lang.Console;
import ntd.util.UtilThread;

import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * 1.i++ 的原子性问题
 * jdk 1.5 以后 java.util.concurrent.atomic.* 里面提供了大量的常用的原子变量
 * 1.volatile 保证内存可见性
 * 2.CAS (Compare-And-Swap)算法保证数据的原子性
 * CAS 算法：硬件对于并发操作共享数据的支持(比互斥锁效率要高)
 * 内存值V - 预估值A - 更新值B，当且仅当 V == A ，V = B，否则，将不做任何操作（保证同时只有一个线程能够操作）
 */
public class DemoAtomic {

    public static void main(String[] args) {
        AtomicDemo ad = new AtomicDemo();
        for (int i = 0; i < 10; i++) {
            new Thread(ad).start();
        }
    }

    static class AtomicDemo implements Runnable {

        // 原子操作对象，目前用于自增
        private AtomicInteger serialNumber = new AtomicInteger(0);

        @Override
        public void run() {
            UtilThread.sleep(200);
            Console.log(Thread.currentThread().getName() + ":" + getSerialNumber());
        }

        public int getSerialNumber() {
            return serialNumber.getAndIncrement();
        }
    }
}
